//题目:
// 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
// 比如输入字符串为 "PAYPLISHIRING" 行数为 3 时，排列如下：
// P   A   H   N
// A P L S I I G
// Y   I   R
// 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。
// 请你实现这个将字符串进行指定行数变换的函数：
// string convert(string s, int numRows);
#include<iostream>
#include<queue>
#include<unordered_map>
#include<string.h>
#include<algorithm>

using namespace std;
//代码:
class Solution 
{
public:
    string convert(string s, int numRows) 
    {
        if(numRows==1)return s;

        vector<string> arr(numRows);//开辟一个numRows大小的数组
        int n=s.size();
        int row=-1,col=0,flag=0;//flag==0表示下降，flag==1表示上升
        for(int i=0;i<n;)
        {
            if(row+1<numRows && flag==0)
                arr[++row]+=s[i++];//下降的过程
            else 
            {
                flag=1;//上升的过程
                if(row>0)
                    arr[--row]+=s[i++];
                else flag=0;//控制上升和下降的标识
            }
        }
        string ret;
        for(int i=0;i<numRows;i++)
        {
            for(int j=0;j<arr[i].size();j++)
                ret+=arr[i][j];
        }
        return ret;
    }
};